package com.team.order.service.impl;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.team.common.core.utils.DateUtils;
import com.team.order.domain.query.OrderQuery;
import com.team.order.domain.vo.OrderVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.team.order.mapper.AdminOrderMapper;
import com.team.order.domain.Order;
import com.team.order.service.IAdminOrderService;

import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.*;

/**
 * 订单管理Service业务层处理
 * 
 * @author 梁国瑞
 * @date 2025-07-09
 */
@Service
public class AdminOrderServiceImpl implements IAdminOrderService
{
    @Autowired
    private AdminOrderMapper adminOrderMapper;

    /**
     * 查询订单详情
     * 
     * @param id 订单管理主键
     * @return 订单管理
     */
    @Override
    public OrderVO selectOrderById(Long id)
    {
        return adminOrderMapper.selectOrderById(id);
    }

    /**
     * 查询订单管理列表
     * 
     * @param query 订单管理
     * @return 订单管理
     */
    @Override
    public List<OrderVO> selectOrderList(OrderQuery query)
    {
        // 1. 一次性查询订单及其一对一关联数据（如用户信息、支付信息等）
        List<OrderVO> orderVOs = adminOrderMapper.selectOrderList(query);
        // 2. 批量查询一对多数据（如服务名称列表）
        Map<Long, List<String>> serviceMap = fetchServicesInBatch(orderVOs);
        // 3. 组装最终结果
        orderVOs.forEach(vo -> vo.setServiceNames(serviceMap.getOrDefault(vo.getOrderId(), emptyList())));
        // 4.返回数据
        return orderVOs;
    }

    private Map<Long, List<String>> fetchServicesInBatch(List<OrderVO> orderVOs) {
        // 提取出所有的订单id
        List<Long> orderIds = orderVOs.stream().map(OrderVO::getOrderId).collect(toList());
        if (orderIds.isEmpty()) {
            return Collections.emptyMap();
        };
        // 批量查询所有关联服务名称（避免循环中单条查询），返回Map结果
        return adminOrderMapper.selectServiceNameByOrderIds(orderIds);
    }



    /**
     * 新增订单管理
     * 
     * @param order 订单管理
     * @return 结果
     */
    @Override
    public int insertOrder(Order order)
    {
        order.setCreateTime(DateUtils.getNowDate());
        return adminOrderMapper.insertOrder(order);
    }

    /**
     * 修改订单管理
     * 
     * @param order 订单管理
     * @return 结果
     */
    @Override
    public int updateOrder(Order order)
    {
        order.setUpdateTime(DateUtils.getNowDate());
        return adminOrderMapper.updateOrder(order);
    }

    /**
     * 批量删除订单管理
     * 
     * @param ids 需要删除的订单管理主键
     * @return 结果
     */
    @Override
    public int deleteOrderByIds(Long[] ids)
    {
        return adminOrderMapper.deleteOrderByIds(ids);
    }

    /**
     * 删除订单管理信息
     * 
     * @param id 订单管理主键
     * @return 结果
     */
    @Override
    public int deleteOrderById(Long id)
    {
        return adminOrderMapper.deleteOrderById(id);
    }

}
